
/**
* @Title: AtomicReferenceDemo.java
* @Package com.leetone.cas
* @Description: 【】
* @date 2018年3月8日 上午9:13:38
* @version V1.0
* @Company: 上海
* @author:[谭磊][leetone123@163.com]
*/

package com.leetone.cas;

import java.util.concurrent.atomic.AtomicReference;

/**
* @ClassName: AtomicReferenceDemo
* @Description: 【针对引用对象的无锁修改方式，线程安全】
* @date 2018年3月8日 上午9:13:38
* @Company: 上海
* @author:[谭磊][leetone123@163.com]
*/

public class AtomicReferenceDemo {
	//设置全局初始值为abc
	static final AtomicReference<String> str = new AtomicReference<String>("abc");
	/**
	* @Title: main
	* @Description: 【】
	* @date 2018年3月8日 上午9:13:38
	* @author:[谭磊][leetone123@163.com]
	* @param @param args    参数
	* @return void    返回类型
	* @throws
	*/

	public static void main(String[] args) {
		//开启10个线程来抢占修改临界区资源
		for(int i=0;i<10;i++)
		{
			final int num = i;
			new Thread() {
				@Override
				public void run() {
					try {
						//每个线程都先睡眠随机时长
						Thread.sleep(Math.abs((int)(Math.random()*100)));
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					//开始对临界区资源进行修改，每次都会确保只有一个胜出，即修改成功，其他的都会失败
					if(str.compareAndSet("abc", "leetone"))
					{
						System.out.println("Thread:"+Thread.currentThread().getId()+"change the value to leetone!");
					}else
					{
						System.out.println("Thread:"+Thread.currentThread().getId()+" failed to change!");
					}
				}
			}.start();
		}
	}

}
